﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Model
{
    public interface IVerandering
    {
        void VoegArtikelToe(int rek, int zijde, int schap, Artikel artikel);
        void VerwijderArtikel(int rek, int zijde, int schap, Artikel artikel);
        void VoegRekToe(Rek rek);
        void VerwijderRek(int rek);
        void VerwijderSchap(int rek, int zijde, int schap);
        void VoegSchapToe(int rek, int zijde, Schap schap);
        void AlgoritmeUitvoeren(List<string> categoriën, int snelheid, int tijd, double bedrag, double factor);
        void VeranderAlgoritme(TypeAlgoritme typeAlgoritme);
        void GeefCategorie(List<string> categoriën);
        void SlaAfbeeldingOp(System.Drawing.Image img);

        void VoegPOIToe(POI punt);

        void StopAlgoritme();
    }

    public class PoortP1 : IVerandering
    {
        private Winkel winkel;
        private AbstracteLaag abstracteLaag;

        public PoortP1()
        {
            winkel = Winkel.GetInstance();
            abstracteLaag = AbstracteLaag.GetInstance();
        }
        
        public void VoegArtikelToe(int rek, int zijde, int schap, Artikel artikel)
        {
            throw new NotImplementedException();
            //winkel.Rekken.Find(rek).Zijden;
            //winkel.VoegArtikelToe(rek, zijde, schap, artikel);
        }

        /// <summary>
        /// Verwijder een artikel uit een schap
        /// </summary>
        /// <param name="rek">Het rek</param>
        /// <param name="zijde">De zijde</param>
        /// <param name="schap">Het schap</param>
        /// <param name="artikel">Het te verwijderen artikel</param>
        public void VerwijderArtikel(int rek, int zijde, int schap, Artikel artikel)
        {
            winkel.VerwijderArtikel(rek, zijde, schap, artikel);
        }

        /// <summary>
        /// Voegt een rek toe aan de winkel
        /// </summary>
        /// <param name="rek">Het toe te voegen rek</param>
        public void VoegRekToe(Rek rek)
        {
            winkel.VoegRekToe(rek);
        }

        /// <summary>
        /// Verwijder een rek uit de winkel
        /// </summary>
        /// <param name="rek">Het te verwijderen rek</param>
        public void VerwijderRek(int rek)
        {
            winkel.VerwijderRek(rek);
        }

        public void CategorieUitsluiten(string categorie)
        {
        }

        /// <summary>
        /// Verwijder een schap uit een zijde van een rek
        /// </summary>
        /// <param name="rek">Het rek</param>
        /// <param name="zijde">De zijde</param>
        /// <param name="schap">Het schap</param>
        public void VerwijderSchap(int rek, int zijde, int schap)
        {
            winkel.VerwijderSchap(rek, zijde, schap);
        }

        /// <summary>
        /// Voeg een schap toe aan de zijde van een rek
        /// </summary>
        /// <param name="rek">Het rek</param>
        /// <param name="zijde">De zijde</param>
        /// <param name="schap">Het schap</param>
        public void VoegSchapToe(int rek, int zijde, Schap schap)
        {
            winkel.VoegSchapToe(rek, zijde, schap);
        }

        /// <summary>
        /// Voert het algoritme uit wat op dit moment toegekend is aan winkel
        /// </summary>
        public void AlgoritmeUitvoeren(List<string> categoriën,int snelheid, int tijd, double bedrag, double factor)
        {
            winkel.AlgoritmeUitvoeren(categoriën, snelheid, tijd, bedrag, factor);
        }

        /// <summary>
        /// Verander het algoritme naar een ander type (bijv. van tijd naar bedrag)
        /// Gebruik hier de enum TypeAlgoritme voor.
        /// </summary>
        /// <param name="typeAlgoritme">Het type algoritme</param>
        public void VeranderAlgoritme(TypeAlgoritme typeAlgoritme)
        {
            winkel.VeranderAlgoritme(typeAlgoritme);
        }

        /// <summary>
        /// Geeft de categorie lijst door aan winkel
        /// </summary>
        /// <param name="categoriën">De lijst van categorieën</param>
        public void GeefCategorie(List<string> categoriën)
        {
            winkel.Categoriën = categoriën;
        }

        /// <summary>
        /// Voegt de image toe aan winkel.
        /// De plattegrond van de winkel wordt nu het mee gegeven image
        /// </summary>
        /// <param name="img">De toe te voegen afbeelding</param>
        public void SlaAfbeeldingOp(System.Drawing.Image img)
        {
            winkel.Plattegrond = img;
        }

        #region IVerandering Members


        public void VoegPOIToe(POI punt)
        {
            abstracteLaag.PuntenVanInteresse.Add(punt);
        }

        public void StopAlgoritme()
        {
            winkel.AlgoritmeStoppen();
        }

        #endregion
    }
}
